// 导入依赖文件
var gulp = require('gulp');
var concat = require('gulp-concat'); // 文件合并
var rename = require('gulp-rename'); // 文件更名
var cssmin = require('gulp-clean-css'); // CSS清理
var htmlmin = require('gulp-htmlmin'); // 压缩HTML

var rollup = require('rollup').rollup;
var commonjs = require('rollup-plugin-commonjs');
var resolve = require('rollup-plugin-node-resolve');
var uglify = require('rollup-plugin-uglify');

// 文件路径
var dist = 'dist/';
var path = {
    dev: {
        css: 'css/',
        view: 'views/',
        assets: 'assets/',
        rollup: 'app/main.aot.js'
    },
    app: {
        css: dist + 'css/',
        view: dist + 'views/',
        assets: dist + 'assets/',
        require: dist + 'require/',
        rollup: dist + 'require/build.js'
    },
    node_modules: {
        'rxjs': 'node_modules/rxjs/**'
    },
    require: {
        'corejs': 'node_modules/core-js/client/**',
        'zonejs': 'node_modules/zone.js/dist/**',
        'jquery': 'node_modules/jquery/dist/**',
        'bootstrap': 'node_modules/bootstrap/dist/**',
        'normalize-css': 'node_modules/normalize-css/**',
        'swiper': 'node_modules/swiper/dist/**',
        'clipboard': 'node_modules/clipboard/dist/**'
    }
};

// 拷贝index.html文件
gulp.task('index', function () {
    return gulp.src('index.dist.html')
        .pipe(rename('index.html'))
        .pipe(gulp.dest(dist));
});

// 压缩CSS文件
gulp.task('css', function() {
    return gulp.src(path.dev.css + '*.css')
        .pipe(concat('style.css'))
        .pipe(rename({suffix: '.min'}))
        .pipe(cssmin())
        .pipe(gulp.dest(path.app.css));
});

// 压缩HTML
gulp.task('html', function () {
    var options = {
        removeComments: true,//清除HTML注释
        collapseWhitespace: true,//压缩HTML
        collapseBooleanAttributes: true,//省略布尔属性的值 <input checked="true"/> ==> <input />
        removeEmptyAttributes: true,//删除所有空格作属性值 <input id="" /> ==> <input />
        removeScriptTypeAttributes: true,//删除<script>的type="text/javascript"
        removeStyleLinkTypeAttributes: true,//删除<style>和<link>的type="text/css"
        minifyJS: true,//压缩页面JS
        minifyCSS: true//压缩页面CSS
    };
    return gulp.src(path.dev.view + '**/*.html')
        .pipe(htmlmin(options))
        .pipe(gulp.dest(path.app.view));
});

// 拷贝依赖库
gulp.task('require', function () {
    for (var key in path.require) {
        gulp.src(path.require[key])
            .pipe(gulp.dest(path.app.require + key));
    }
    return;
});

// 拷贝静态资源文件
gulp.task('assets', function () {
    return gulp.src(path.dev.assets + '**/*')
        .pipe(gulp.dest(path.app.assets));
});

// 压缩图像

// 摇树操作
gulp.task('rollup', function () {
    return rollup({
        entry: path.dev.rollup,
        plugins: [
            resolve({jsnext: true, module: true}),
            commonjs({
                include: path.node_modules.rxjs
            }),
            uglify()
        ]
    }).then(function (bundle) {
        // 输出 bundle + sourcemap
        // output format - 'amd', 'cjs', 'es6', 'iife', 'umd'
        // amd – 使用像requirejs一样的银木块定义
        // cjs – CommonJS，适用于node和browserify / Webpack
        // es6 (default) – 保持ES6的格式
        // iife – 使用于<script> 标签引用的方式
        // umd – 适用于CommonJs和AMD风格通用模式
        /*
        var result = bundle.generate({
            format: 'cjs'
        });
        fs.writeFileSync( 'bundle.js', result.code );
        */
        bundle.write({
            format: 'cjs',
            dest: path.app.rollup,
            sourceMap: true,
        });
    });
});

// 监听文件修改实时编译
/*
gulp.task('watch', function() {
    // 监听css文件变化
    gulp.watch(path.dev.css + '*.css', ['css']);
});
*/

// 载入任务
gulp.task('default', ['index', 'html', 'require', 'assets', 'rollup']);
